package com.kaoqin.code.quartz.util;

import org.apache.log4j.Logger;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;

import com.kaoqin.code.quartz.JobFactory;
import com.kaoqin.code.quartz.vo.QuartzVO;
/**
 * 
* @ClassName: CmsVideoScheduleUtils 
* @Description: 定时任务辅助类
* @author Janus
* @date 2017年8月4日 上午10:33:54
 */
public class ScheduleUtils {

    /** 日志对象 */
    private static final Logger LOG = Logger.getLogger(ScheduleUtils.class);

    /**
    * @Title: getTriggerKey 
    * @Description:  获取触发器key
    * @param @param jobName
    * @param @param jobGroup
    * @param @return    设定文件 
    * @return TriggerKey    返回类型 
    * @throws 
    * @author Janus
    * @Date 2017年8月4日 上午10:34:28
     */
    public static TriggerKey getTriggerKey(String jobName, String jobGroup) {
        return TriggerKey.triggerKey(jobName, jobGroup);
    }

    /**
    * @Title: getCronTrigger 
    * @Description:  获取表达式触发器
    * @param @param scheduler
    * @param @param jobName
    * @param @param jobGroup
    * @param @return    设定文件 
    * @return CronTrigger    返回类型 
    * @throws 
    * @author Janus
    * @Date 2017年8月4日 上午10:34:41
     */
    public static CronTrigger getCronTrigger(Scheduler scheduler, String jobName, String jobGroup) {

        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
            return (CronTrigger) scheduler.getTrigger(triggerKey);
        } catch (SchedulerException e) {
            LOG.error("获取定时任务CronTrigger出现异常", e);
            throw new RuntimeException("获取定时任务CronTrigger出现异常");
        }
    }

    /**
    * @Title: createScheduleJob 
    * @Description: 创建任务
    * @param @param scheduler
    * @param @param vo    设定文件 
    * @return void    返回类型 
    * @throws 
    * @author Janus
    * @Date 2017年8月4日 上午10:36:19
     */
    @SuppressWarnings("deprecation")
	public static void createScheduleJob(Scheduler scheduler, QuartzVO vo) {
        createScheduleJob(scheduler, vo.getJobName(), vo.getJobGroup(),
        		vo.getJobCornDate(), vo);
    }

    /**
    * @Title: createScheduleJob 
    * @Description: 创建定时任务
    * @param @param scheduler
    * @param @param jobName
    * @param @param jobGroup
    * @param @param cronExpression
    * @param @param isSync
    * @param @param param    设定文件 
    * @return void    返回类型 
    * @throws 
    * @author Janus
    * @Date 2017年8月4日 上午11:02:54
     */
    public static void createScheduleJob(Scheduler scheduler, String jobName, String jobGroup,
                                         String cronExpression,Object param) {
        //同步或异步
        Class<? extends Job> jobClass = JobFactory.class;
        //构建job信息
        JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroup).build();
        //放入参数，运行时的方法可以获取
        jobDetail.getJobDataMap().put("jobParam", param);
        //表达式调度构建器
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
        //按新的cronExpression表达式构建一个新的trigger
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroup)
            .withSchedule(scheduleBuilder).build();
        try {
            scheduler.scheduleJob(jobDetail, trigger);
        } catch (SchedulerException e) {
        	e.printStackTrace();
            throw new RuntimeException("创建定时任务失败");
        }
    }


    /**
    * @Title: getJobKey 
    * @Description: 获取jobKey
    * @param @param jobName
    * @param @param jobGroup
    * @param @return    设定文件 
    * @return JobKey    返回类型 
    * @throws 
    * @author Janus
    * @Date 2017年8月4日 上午11:06:06
     */
    public static JobKey getJobKey(String jobName, String jobGroup) {
        return JobKey.jobKey(jobName, jobGroup);
    }

    /**
    * @Title: updateScheduleJob 
    * @Description:  更新定时任务
    * @param @param scheduler
    * @param @param vo    设定文件 
    * @return void    返回类型 
    * @throws 
    * @author Janus
    * @Date 2017年8月4日 上午11:07:32
     */
    public static void updateScheduleJob(Scheduler scheduler,QuartzVO vo) {
        updateScheduleJob(scheduler, vo.getJobName(), vo.getJobGroup(),vo.getJobCornDate());
    }

    /**
    * @Title: updateScheduleJob 
    * @Description: 更新定时任务
    * @param @param scheduler
    * @param @param jobName
    * @param @param jobGroup
    * @param @param cronExpression
    * @param @param param    设定文件 
    * @return void    返回类型 
    * @throws 
    * @author Janus
    * @Date 2017年8月4日 上午11:07:47
     */
    public static void updateScheduleJob(Scheduler scheduler, String jobName, String jobGroup,
                                         String cronExpression) {
        try {
            TriggerKey triggerKey = ScheduleUtils.getTriggerKey(jobName, jobGroup);
            //表达式调度构建器
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            //按新的cronExpression表达式重新构建trigger
            Trigger trigger1 = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder)
                .build();
            //按新的trigger重新设置job执行
            scheduler.rescheduleJob(triggerKey, trigger1);
        } catch (SchedulerException e) {
        	e.printStackTrace();
            throw new RuntimeException("更新定时任务失败");
        }
    }

    /**
    * @Title: deleteScheduleJob 
    * @Description: 删除定时任务
    * @param @param scheduler
    * @param @param jobName
    * @param @param jobGroup    设定文件 
    * @return void    返回类型 
    * @throws 
    * @author Janus
    * @Date 2017年8月4日 上午11:08:02
     */
    public static void deleteScheduleJob(Scheduler scheduler, String jobName, String jobGroup) {
        try {
            scheduler.deleteJob(getJobKey(jobName, jobGroup));
        } catch (SchedulerException e) {
        	e.printStackTrace();
            throw new RuntimeException("删除定时任务失败");
        }
    }
}

